/*
def start():
    print("=" * 10, "开始生成项目结算单", "=" * 10)
    fileList = allFilePath(os.path.join("../审计数据"))
    print("共读取文件数：\t%s" % len(fileList))
    for fileName in fileList:
        file_path = fileName.replace("\\", "/").split("/")[-2]
        pname = fileName.replace("\\", "/").split("/")[-1].replace(".xlsx", "")
        if pname.startswith("~") or pname.startswith("0") or os.path.isdir(os.path.join("../审计数据", fileName)):
            continue

        print("-" * 5, f"正在处理\t{pname}\t项目文件", "-" * 5)
        员工明细df = pd.read_excel(fileName, sheet_name=0, converters={"身份证号": str, "人员类别（甲、乙、丙、丁）": str})
        工作内容df = pd.read_excel(fileName, sheet_name=1, converters={"身份证号": str})
        # 创建 workbook 并组织格式
        结算单book(员工明细df, 工作内容df, pname, file_path)
    print("=" * 10, "项目结算单生成完毕", "=" * 10)
    核对df.to_excel("../审计数据/09-核对数据.xlsx", index=False)
    print("=" * 10, "核对数据生成完毕", "=" * 10)
    return is_difference_within_limit  # 正常 > True ； 差过大 > False
*/
use anyhow::{Context, Result};
use polars::prelude::*;
use std::fs::File;
use std::path::{Path, PathBuf};
use walkdir::WalkDir;

use crate::gen01::read_excel::ExcelReader;
use crate::gen01::settlement::generate_settlement;
use crate::gen01::utils::get_excel_files;
use crate::gen01::verification::write_verification_data;

pub fn start() -> Result<bool> {
    // 打印起始横幅
    println!("{:=^40}", "开始生成项目结算单");

    // 构建审计数据路径
    let audit_path = Path::new("审计数据");
    let file_list = get_excel_files(audit_path);
    println!("共读取文件数：\t{}", file_list.len());

    // 创建核对数据存储结构
    let mut verification_data = Vec::new();
    let mut is_within_limit = true;

    for file_path in &file_list {
        let path_str = file_path.to_string_lossy().replace("\\", "/");
        let components: Vec<&str> = path_str.split('/').collect();

        // 跳过无效数据
        let file_name = components.last().unwrap();
        if file_name.starts_with('~') || file_name.starts_with('0') || file_path.is_dir() {
            continue;
        }

        let pname = file_name.trim_end_matches(".xlsx");
        println!("{:-^40}", format!("正在处理\t{}\t项目文件", pname));

        // 创建读取器（类型转换）
        let reader = ExcelReader::new(&[
            ("身份证号", DataType::String),
            ("人员类别（甲、乙、丙、丁）", DataType::String),
            ("应发合计", DataType::Float64),
            ("定额服务", DataType::Float64),
            ("应扣质保金", DataType::Float64),
            ("应发质保金", DataType::Float64),
            ("专项工资", DataType::Float64),
        ]);

        // 读取第一个sheet（员工明细）
        let staff_df = reader.read_excel(file_path, 0)?;
        println!("员工明细数据：\n{}", staff_df);

        // 读取第二个sheet（工作内容）
        let work_df = reader.read_excel(file_path, 1)?;

        // 生成结算单
        generate_settlement(&staff_df, &work_df, pname, components[components.len() - 2])?;
    }

    // 生成核对文件
    write_verification_data("../审计数据/09-核对数据.xlsx", &verification_data)?;
    println!("{:=^40}", "核对数据生成完毕");

    Ok(is_within_limit)
}
